/*
 * Mathe.cpp
 *
 *      Author: Christian
 *      Letztes Update: 03.11.13 Christian | Code Aufräumen
 *
 */

#ifndef MPU_6050_H_
#define MPU_6050_H_

#include <avr/io.h>
#include "twi_master.h"
#include "Feedback.h"

////////////////////////////////////////////////////////////////
//
// Beim Einschalten Delay bis die Spannungen Stabil sind bevor der MPU initialisiert wird
//
// Adresse anpassen
//
// Frequenz in twi_master.h anpassen
//
////////////////////////////////////////////////////////////////

#define MPU_6050_SLAVE_ADDRESS_W 0b11010000

#define MPU_6050_SLAVE_ADDRESS_R 0b11010001

/* Uebertragungsprotokoll im Datenblatt
 *
 */

////////////////////////////////////////////////////////////////

/* Initalisiert den Sensor
 * Setzt Anfangswerte f�r die Range
 * Einstellungen f�r Interrupts und Clock werden gemacht
 *
 * Standard Einstellungen belassen
 */
void mpu_init( void );


/* Startet Selbsttest Sequenzen
 * Wertet die Ergebnisse aus
 * return 1 bei Erfolg
 *
 * !!!!! Nicht Implementiert !!!!!
 *
 */
uint8_t mpu_self_test( void );

/* Schreibt Config-Daten in ein Register
 *
 * return 1 bei Erfolg
 */
uint8_t mpu_write_register( uint8_t reg, uint8_t wert );

/* Liest ein Register aus
 *
 * return 1 bei Erfolg
*/
uint8_t mpu_read_register( uint8_t reg, uint8_t *data);

/* Liest ein Wert (16 Bit) aus
 * �bergabe des _H Registers
 * verwendet den Burst-Read mode
 * return 1 bei Erfolg
*/
uint8_t mpu_read_value( uint8_t reg_h, int16_t *data);

//////////////////////////////////////////////////////////////////
/*
 * Offset Werte
 */
	extern int16_t xA_off;
	extern int16_t yA_off;
	extern int16_t zA_off;

	extern int16_t xG_off;
	extern int16_t yG_off;
	extern int16_t zG_off;

///////////////////////////////////////////////////////////////////
/* Konfigurationswerte
 *
 * in die Entsprechenden Register schreiben
 */

// GYRO_CONFIG

#define GYRO_SELF_TEST_CONFIG 		0xE0			// Self-Test +  +-250�/s

#define GYRO_NO_SELF_TEST_250		0x00			// Range : +-250�/s
#define GYRO_NO_SELF_TEST_500		0x08			// Range : +-500�/s
#define GYRO_NO_SELF_TEST_1000		0x10			// Range : +-1000�/s
#define GYRO_NO_SELF_TEST_2000		0x18			// Range : +-2000�/s


// ACCEL_CONFIG

#define ACCEL_SELF_TEST_CONFIG		0xF0			// Self-Test + +-8g

#define ACCEL_NO_SELF_TEST_2		0x00			// Range : +-2g
#define ACCEL_NO_SELF_TEST_4		0x08			// Range : +-4g
#define ACCEL_NO_SELF_TEST_8		0x10			// Range : +-8g
#define ACCEL_NO_SELF_TEST_16		0x18			// Range : +-16g

///////////////////////////////////////////////////////////
/* Register
 *
 * Hex Adressen aus der Register Map
 *
 */


#define SELF_TEST_X 		0x0D
#define SELF_TEST_Y 		0x0E
#define SELF_TEST_Z 		0x0F
#define SELF_TEST_A			0x10

#define SMPLRT_DIV			0x19
#define CONFIG				0x1A
#define GYRO_CONFIG			0x1B
#define ACCEL_CONFIG		0x1C

#define MOT_THR				0x1F
#define FIFO_EN				0x23

	/* I2C - Register ausgelassen
	 * nur f�r Kommunikation mit externen Sensoren n�tig
	 */

#define INT_PIN_CFG			0x37
#define INT_ENABLE			0x38
#define INT_STATUS			0x3A

#define ACCEL_XOUT_H		0x3B
#define ACCEL_XOUT_L		0x3C
#define ACCEL_YOUT_H		0x3D
#define ACCEL_YOUT_L		0x3E
#define ACCEL_ZOUT_H		0x3F
#define ACCEL_ZOUT_L		0x40

#define TEMP_OUT_H			0x41
#define TEMP_OUT_L			0x42

#define GYRO_XOUT_H			0x43
#define GYRO_XOUT_L			0x44
#define GYRO_YOUT_H			0x45
#define GYRO_YOUT_L			0x46
#define GYRO_ZOUT_H			0x47
#define GYRO_ZOUT_L			0x48

	/* EXT_SENS_DATA Register ausgelassen
	 * nicht angeschlossen
	 */

#define SIGNAL_PATH_RESET 	0x68
#define MOT_DETECT_CTRL		0x69
#define USER_CTRL			0x6A
#define PWR_MGMT_1			0x6B
#define PWR_MGMT_2			0x6C

#define FIFO_COUNTH			0x72
#define FIFO_COUNTL			0x73
#define FIFO_R_W			0x74

#define WHO_AM_I			0x75

////////////////////////////////////////////////////////////////

#endif /* MPU_6050_H_ */
